<?php
namespace app\index\controller;

//导入模型类
use app\index\model\Staff;
//导入加载器类:Loader.php
use think\Db;
use think\Loader;
class Index {
    //1.获取单条:get静态方法
    public function index(){

        //1.获取表中单条记录
        /*$result = Staff::get(1002) //静态调用get方法,主键查询
        -> getData();    //获取数据对象中原始数据*/

        //
        /*$result = Staff::get('1002') //静态调用get方法,主键查询
        -> getData();        //获取数据对象中原始数据*/

        //二、表达式查询
        //1.获取表中单条记录
        /*$result = Staff::get(['id'=>1003]) //静态调用get方法
        -> getData();    //获取数据对象中原始数据*/


        //第一种：
        $map['id'] = 1004;       //查询条件用数组方式
//        $map['name'] = "开发部";
        $result1 = Staff::get($map) //静态调用get方法
        -> getData();    //获取数据对象中原始数据
        //第二种：
        $map['id'] = ['=',1005];  //查询条件用数组表达式
        $result2 =  Staff::get($map) //静态调用get方法
        -> getData();    //获取数据对象中原始数据



        //闭包查询：支持更多的过滤条件，提供更加高级的查询

        $closure = function ($query){
            $query->field('id,name,salary')->where('id=1001');
        };

        $result = Staff::get($closure)->getData();



        //2.查询原始数据
        dump($result);
    }
    //2.获取单条:对象查询
    //Model对象查询单条记录  采用模型对象查询记录非常方便！ 但是效率不如静态方法~~
    public function index1(){

        $model = new Staff();
        $result = $model->where('id',1002)->find()->getData();
//        $result = $model->where('id',1002)->find();

        dump($result);
        //设置字段别名
        $field['id'] = '编号';
        $field['name'] = '姓名';
        $field['sex'] = '性别';
        $field['salary'] = '工资';

        //设置查询表达式
        $map['id'] = 1001;

        //1.创建模型对象
        $model = new Staff();

        //2.执行查询,返回数据对象数组
        $result = $model -> field($field)  //限制显示字段
        -> where($map)    //过滤查询结果
        -> find();      //获取结果集
        //SELECT `id` AS `编号`,`name` AS `姓名`,`age` AS `年龄`,`salary` AS `工资` FROM `tp5_staff` WHERE `id` = 1009 LIMIT 1
        //getData()可以获取数据对象原始数据:$data属性值
        dump($result -> getData());


    }
    //3.获取多条:all静态方法
    //查询多条数据：all( )方法
    public function index2(){

//        $result1 = Staff::all();

//        dump($result1);

        //1.执行查询,返回数据对象数组
//        $result = Staff::all('1001,1002');

//        all( ) 方法的主键列表：还可以用数组表示
//        1.执行查询,返回数据对象数组
//        $result = Staff::all([1001,1002]);
        $result = Staff::all();
        //SELECT * FROM `tp5_staff` WHERE `id` IN (1009,1010) ;
        //2.遍历该数据对象数组:$result
        //$data既是循环变量,也是其中一个数据对象

        foreach ($result as $data){
            //getData()可以获取数据对象原始数据:$data属性值
            dump($data -> getData());
        }
    }

    //二、任务2：查询表中年龄age大于30，并且工资salary大于800的员工信息
    public function index3(){

        //1.构造查询表达式
        $map['id'] = ['>',1002];
        $map['salary'] = ['>',8000];

        //2.执行查询,返回数据对象数组
        $result = Staff::all($map);
        //SELECT * FROM `tp5_staff` WHERE `age` > 30 AND `salary` > 8000;
        //3.遍历该数据对象数组:$result
        //$data既是循环变量,也是其中一个数据对象
        foreach ($result as $data){

            //getData()可以获取数据对象原始数据:$data属性值
            dump($data -> getData());
        }

    }
    //三、任务3：在任务2的基础上(age>30 AND salary>8000)，我们又提出了三个需求：按工资排序，只输出工资最高的3个人的编号,姓名,年龄,工资信息。
    public function index4(){

        $closure = function ($query){

            //1.设置字段别名
            $field['id'] = '编号';
            $field['name'] = '姓名';
            $field['sex'] = '性别';
            $field['salary'] = '工资';
            //2.设置查询表达式
            $where['id'] = ['>','1002'];
            $where['salary'] = ['>',4000];

            //3.执行查询
            $query->field($field)
                ->where($where)
                ->order('salary desc')
                ->limit(3);
        };


        //2.执行闭包查询,返回数据对象数组
        //其实我们将闭包查询中的all( ),换成:select( )方法，查询结果是一样的
//        $result = Staff::all($closure);
        $result = Staff::select($closure);
        //SELECT `id` AS `编号`,`name` AS `姓名`,`age` AS `年龄`,`salary` AS `工资` FROM `tp5_staff` WHERE `age` > 30 AND `salary` > 8000 ORDER BY salary desc LIMIT 3
        //3.遍历该数据对象数组:$result
        //$data既是循环变量,也是其中一个数据对象
        foreach ($result as $data){

            //getData()可以获取数据对象原始数据:$data属性值
            dump($data -> getData());
        }

    }

    //4.获取多条:对象查询
    //4.获取多条:对象查询  查询tp5_staff表中，年龄大于30，工资大于8000的员工信息:编号、姓名、年龄、工资；

    public function index5(){
        //1.设置字段别名
        $field['id'] = '编号';
        $field['name'] = '姓名';
        $field['sex'] = '性别';
        $field['salary'] = '工资';
        //2.设置查询表达式
        $where['id'] = ['>','1002'];
        $where['salary'] = ['>',4000];

        //1.创建模型对象
        $model = new Staff();

        //2.执行查询,返回数据对象数组
        $result = $model -> field($field)  //限制显示字段
        -> where($where)//过滤查询结果
        ->order('salary', 'desc')//指定排序 order('id','desc') 或者 order(['id'=>'desc','create_time'=>'desc'])
        -> select();      //获取结果集
        //SELECT `id` AS `编号`,`name` AS `姓名`,`age` AS `年龄`,`salary` AS `工资` FROM `tp5_staff` WHERE `age` > 30 AND `salary` > 8000
        //3.遍历该数据对象数组:$result
        //$data既是循环变量,也是其中一个数据对象
        foreach ($result as $data){

            //getData()可以获取数据对象原始数据:$data属性值
            dump($data -> getData());
        }
    }

    //5.获取字段值:value方法  字段值针对单条记录才有意义，如果返回多个记录，仅获取第一个记录的指定字段值
    public function index6(){

        //一、模型静态调用【数据库查询方法】实现

        //模型静态调用【数据库查询方法】
        $data1 = Staff::where('id',1001)->value('name');

        //查看结果
        dump($data1);
        //二、模型对象调用：
        //模型对象调用数据库查询方式:此写法省去了对象变量名称
        $data2 = (new Staff)->where('id',1001)->value('name');

        //查看结果
        dump($data2);
        //三、模型静态调用【模型方法】实现：
        //模型静态调用【模型查询方法】
        $data = Staff::get(1001)->getData('name');

        //查看结果
        dump($data);

    }
    //6.获取列值:column方法
    public function index7(){
        //任务：获取tp5_staff表中，id=1010到1015之间的的员工id,姓名，年龄，工资
        //一、模型静态调用【数据库查询方法】实现：
        $result = Staff::where('id','between',[1001,1006])->column('name');

        //查看结果
        dump($result);
        //二、模型对象调用：
        //模型对象调用数据库查询方式:此写法省去了对象变量名称
        ////二个以上字段，会返回二维数组
        ////同样，默认取第一个字段为元素键名
        $data = (new Staff)->where('id','between',[1001,1006])->column('name,id,salary');
        $data1 = (new Staff)->where('id','between',[1001,1006])->column('id,name');

        //查看结果
//        dump($data);
//        dump($data1);


        //模型对象调用数据库查询方式:此写法省去了对象变量名称
        //column()第二个参数设置了自定义的结果数组的键名:name
        $data2 = (new Staff)->where('id','between',[1001,1006])
            ->column('id,name,salary','name');

        //查看结果
        dump($data2);


        //三、模型静态调用【模型方法】实现：
        $result = Staff::all(['id'=>['between',[1001,1006]]]);

        foreach ($result as $data3){

            //getData()可以获取数据对象原始数据:$data属性值
            dump($data3 -> getData());
        }


    }
    //7.动态查询:getBy字段名
    //一、任务1：查询姓名name等于"李云龙"的记录
    /*尽管动态查询方法的参数支持查询表达式，但不要比较或范围表达式，因为仅返回第一条满足条件记录，
    通常是没有意义的。模糊查询有时很有用，但同样也仅获取结果集的首条记录。*/
    public function index8(){

        //1.获取name='李云龙'的【数据对象】
        $result = Staff::getByName('宋小江');
//        $result = Staff::getById('洪七公');
//        $result = Staff::getById('1005');

        //2.获取数据对象原始数据
        $data = $result -> getData();

        //3.查看结果
//        dump($data);

        //从第一条开始找 找到就再不找了
        //1.获取name中包含"大"字符的记录，返回【数据对象】
        $result = Staff::getByName(['like','%小%']);

        //2.获取数据对象原始数据
        $data = $result -> getData();

        //3.查看结果
        dump($data);
    }
    //8.助手函数:model查询
    //助手函数类随框架自动加载，不需要手工导入
    //任务 ：查询编号id=1009的员工信息(id编号,姓名name,工资salary)
    public function index9(){


        $where['id'] = ['>','1002'];
        $where['salary'] = ['>',4000];
        //SELECT `id`,`name`,`salary` FROM `tp5_staff` WHERE ( id = 1009 ) LIMIT 1
//        $data = model('staff')->field('id,name,salary')->where('id=1002')->find();
        $data = model('staff')->field('id,name,salary')
            ->where($where)
            ->select();
        //解析数据对象中的原始数据:$data属性
//        $result = $data->getData();
        $result = $data[0]->getData();

        //输出结果:二维数组
        dump($result);
    }

    //9.加载器:Loader类查询
    public function index10(){

        //**方案1：**利用Loader类model静态方法自动加载自定义模型并实例化，得到模型对象。
        //获取满足条件的单个记录:返回一个数据对象
        $data = Loader::model('Staff')  //加载模型类并创建模型对象
        ->field('id,name,salary')  //设置显示字段
        ->where('id = 1001')    //设置查询条件
        ->find();       //获取查询结果

        //解析数据对象中的原始数据:$data属性
        $result = $data -> getData();

        //输出结果:二维数组
        dump($result);

        //**方案2：**利用Loader类db静态方法自动数据库类并创建连接对象。

        //获取满足条件的单个记录:返回一维数组
        $data = Loader::db()       //加载数据库类并创建连接对象
        ->table('staff')  //设置当前数据表
        ->field('id,name,salary')  //设置显示字段
        ->where('id = 1002')    //设置查询条件
        ->find();       //获取查询结果````

        //因为结果集不是对象，无须解析，所以直接输出原始数据
        dump($data);
        //方案3： 利用Loader类model静态方法得到模型对象后，不调用数据库方法，而是直接调用模型方法来完成查询。

        //创建查询闭包函数
        $closure = function ($query){  //闭包匿名函数
            $query -> field('id,name,salary')  //设置显示字段
            -> where('id = 1004');  //设置查询条件
        };

        //获取满足条件的单个记录:返回一个数据对象
        $data = Loader::model('Staff')->get($closure);

        //解析数据对象中的原始数据:$data属性
        $result = $data -> getData();

        //输出结果:二维数组
        dump($result);
    }

    public function index11(){
        //设置查询条件
        $map = [];
        $map['id'] = ['>',1001];
        $map['salary'] = ['<',9000];

        //数据库静态查询:返回结果集【二维数组】
        $result1 = Db::table('staff')->where($map)->select();

        //模型静态查询:返回结果集【数据对象数组】
        $result2 = Staff::where($map)->select();

        //输出数据库方式获取的结果集
        dump($result1);

        //模型查询结果是对象数组,必须用循环来遍历
        foreach ($result2 as $data){

            //获取数据对象原始数据
            dump($data -> getData());
        }
    }


    public function test(){
        //创建模型类Staff
        $model = new Staff();

        //查看Staff类实例$model
        dump($model);
    }
}
